package java_thinking.unit_21._21_7;

import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;

/**
 * @Desc:   7-11 通过改写 interrupt 方法，将非标准的取消操作封装在 Thread 中
 *          1.通过以下的方法，无论 ReaderThread 线程是在 read 方法中阻塞还是在某个可中断的
 *            阻塞方法中阻塞，都可以被中断并停止执行当前的工作
 *
 *          2.通过 newTaskFor 来封装非标准的取消见
 * @author: cww
 * @DateTime: 2019-06-15 15:12
 */

public class ReaderThread extends Thread {
    private final Socket socket;
    private final InputStream in;
    private static final int BUFSZ = 512;

    public ReaderThread(Socket socket, InputStream in) {
        this.socket = socket;
        this.in = in;
    }

    /**
     * 改写 interrupt 使其既能处理标准的中断，也能关闭底层的套接字
     */
    @Override
    public void interrupt() {
        try {
            /**
             * 处理需要被关闭的对象等
             */
            socket.close();
        } catch (IOException ignored) {

        } finally {
            super.interrupt();
        }
    }

    @Override
    public void run() {
        try {
            byte[] buf = new byte[BUFSZ];
            while (true) {
                int count = in.read(buf);
                if (count < 0) {
                    break;
                } else if (count > 0) {
                    processBuffer(buf, count);
                }
            }
        } catch (IOException e) {
            /* 允许线程退出 */
        }
    }

    public void processBuffer(byte[] buf, int count) {
    }
}
